blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_1 正規表現

Perl 「 正規表現 」: 結合演算子 ( =~ ) (0x6a)

Perl 「 正規表現 」: 結合演算子 ( =~ ) (0x6a)

目次 - Perl Index



Theme



Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x6a 回。

Perl の「 正規表現 」( Regular expression ) 結合演算子 ( Binding operator または 拘束演算子 )「 =~ 」について。




マッチング対象を指定する「 =~ 」



Perl の結合演算子 ( 拘束演算子 )「 =~ 」は、正規表現のパターンマッチングに関わる操作一般で利用されます。

代入演算子「 = 」に似ていますが、「 ~ 」( tilde ) が添えられています。

Perl 「 正規表現 」を少しだけ説明 (0x18) 」で確認した通り、マッチング対象の値を左辺に、正規表現パターンを右辺に指定します。

これまで確認した、マッチングのための演算子「 m// ( とその省略形 // ) 」を初めとする正規表現の演算子 ( s///, qr// 等) は、デフォルトで、暗黙の標準変数 $_ をその対象とします。

つまり、マッチングの対象を特に指定しない場合、それは暗黙的に「 $_ 」を対象にしています。


/pattern matching/; # $_ を対象にしたマッチング


結合演算子「 =~ 」は、「 $_ 」以外の値を任意に指定するための演算子です。

なお、対象になる値は通常スカラ値 ( あるいはスカラ式 ) です。

「 =~ 」を利用する



「 =~ 」を実際に利用してみます。

まずは、リテラルな文字列を指定します。


"String literal" =~ /literal/;


次に、スカラ変数を指定します。


$string =~ /scalar/; # $string は文字列 scalar を含むか ?


スカラのリストを持つ配列やハッシュは、そのままの姿で指定出来ません。


%hash =~ /hash/; # Oops !
@array =~ /array/; # Oops !


これらは、foreach 文等で要素を 1 ずつ取り出して ( スカラ値にして) から指定します。


# ハッシュ
foreach my $key ( keys %hash ) {
$key =~ /hash/; # %hash は文字列 hash を含むか ?
:
.
}

# 配列
foreach my $elem ( @arry ) {
$elem =~ /array/; # @array は文字列 array を含むか ?
:
.
}


コンテキストによる「 =~ 」の動作



結合演算子「 =~ 」は、スカラコンテキストでは 真偽 の値を返します。パターンがマッチングすれば 真、そうでなければ 偽 です。

if 文等の条件式でパターンマッチングを指定した場合、ブロック内の処理は 真 で実行され、偽 でスルーされます。

また、次の例では、偽 で「 0 ( または空文字 ) 」、真 で「 0 以外 ( 大抵は 1 ) 」がスカラ変数 $bool に代入されます。


$bool = ($string =~ /pattern/);


結合演算子「 =~ 」の優先順位は、代入演算子「 = 」よりも高いので、「 ( ) 」を外しても問題ありません。演算子の優先順位は perldoc - perlop で確認出来ます。


$bool = $string =~ /pattern/;


リストコンテキストでの振る舞いは演算子に依存するそうですが、少なくとも「 ( ) 」でパターンのキャプチャを行った場合は、キャプチャされたパターンを取り出して代入することが出来ます。


($capture) = $string =~ /(pattern)/;


パターンマッチングが成功した場合、スカラ変数 $capture には、文字列「 pattern 」が代入されます。

マッチングが失敗した場合は空文字が代入され、警告を有効にしていれば警告文が表示されます。

これは、「 Perl 「 正規表現 」: キャプチャの参照 (0x5d) 」で確認した、キャプチャのための特殊なスカラ変数 ( マッチ変数 )「 $1, $2 ...」を使った参照の異なる書き方です。

次の例は基本的に同じことです。


$sting =~ /(pattern1)\s(pattern2)/;
print "$1, $2";

($capt1, $catpt2) = $sting =~ /(pattern1)\s(pattern2)/;
print "$capt1, $capt2";


リストコンテキストの結合演算子「 =~ 」の詳細な振る舞いは perldoc - perlop の "Regexp Quote-Like Operators" を確認してください。

「 =~ 」の否定「 !~ 」



結合演算子「 =~ 」の否定として「 !~ 」が用意されています。

「 !~ 」の動作は「 =~ 」の論理否定という以外は基本的に同じです。

0x6a -> 0x6b へ



右も左もわからなかった Perl ( というよりもプログラミング ) 初心者の僕は、結合演算子「 =~ 」を初めて見た時からしばらくの間「 これは代入演算子の亜種に違いない 」と思っていました。刷り込み効果による「 = 」のイメージが強かったからです。

検索エンジンでちょろりと調べてみはしますものの記号の検索は難しいので困ります。

正規表現に関わる記号、とでも分かっていれば良かったのでしょうがなにぶん初心者なので分かりません。

しかしながら、当連載も 108 回目を数えたここのところ、分からないことを分かるまでに要する時間がとても短くなりました。

なぜなら、知識と経験の地味な積み上げが、少しずつ相互連結を初めているからです。

ある事柄についての相互連結が頭の中である程度の面積を形成しはじめると、その分布から推定して分からないことの座標特定が早くなります。

また、その周囲にある習得済みの事柄が手掛かりとなって関連付けが出来る様になるので、おのずと理解が早まる訳ですね。

参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。

目次 - Perl Index





















同じカテゴリー(Perl)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲